﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;

namespace SIMCRepositorio
{
    public interface IRepositorioDireccion
    {
        IList<DireccionFisica> BuscarLista(int p_IdPersona);

        DireccionFisica BuscarDireccion(int p_IdPersona, string p_TipoDireccion);
    }

    public class RepositorioDireccion : Database, IRepositorioDireccion
    {
        public IList<DireccionFisica> BuscarLista(int p_IdPersona)
        {
            try
            {
                var query = from direccion in Context.per_direcciones
                            join pais in Context.zon_paises
                                on direccion.ped_spais equals pais.zpa_scodigo into PaisDireccion
                            from pais in PaisDireccion.DefaultIfEmpty()
                            join region in Context.zon_region
                                on direccion.ped_sregion equals region.zre_scod_region into RegionDireccion
                            from region in RegionDireccion.DefaultIfEmpty()
                            join valor in Context.cla_valores
                                on direccion.ped_stp_dir equals valor.cav_scodigo into ValorDireccion
                            from valor in ValorDireccion.DefaultIfEmpty()
                            where direccion.ped_ipersona == p_IdPersona
                            && valor.cav_satributo == Valores.TipoDireccion
                            select new 
                        	{
                        		Direccion = direccion,
                        		Pais = pais,
                        		Region = region,
                        		Valor = valor
                        	};
	
                //Se hizo de esta forma debido a que para el momento, LINQ to Entities no soporta la 
                //creación de objectos en el query
	            List<DireccionFisica> lista = new List<DireccionFisica>();

                foreach (var item in query)
                {
                    lista.Add(new SIMCObjetoNegocio.DireccionFisica
                                {
                                    IdPersona = item.Direccion.ped_ipersona,
                                    IdAtencion = item.Direccion.ped_iper_dirigido,
                                    EsPrincipal = item.Direccion.ped_cenvio == Valores.True ? true : false,
                                    TipoDireccion = item.Direccion.ped_stp_dir,
                                    Pais = item.Direccion.ped_spais,
                                    Region = item.Direccion.ped_sregion,
                                    Poblacion = item.Direccion.ped_stitulo,
                                    ZonaPostal = item.Direccion.ped_szip,
                                    Linea1 = item.Direccion.ped_slinea1,
                                    Linea2 = item.Direccion.ped_slinea2,
                                    Linea3 = item.Direccion.ped_slinea3,
                                    Linea4 = item.Direccion.ped_slinea4,
                                    Telefono = (item.Direccion.ped_stelefono != null) ? new Telefono(item.Direccion.ped_stelefono, "Telefono", item.Pais.zpa_sddi): new Telefono(),
                                    Fax = (item.Direccion.ped_sfax != null) ? new Telefono(item.Direccion.ped_sfax, "Telefono", item.Pais.zpa_sddi): new Telefono(),
                                    CodPais = item.Direccion.ped_spais,
                                    CodRegion = item.Direccion.ped_sregion,
                                    TipoDireccionDescripcion = item.Valor.cav_sdescripcion,
                                });
                }

                return lista.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public DireccionFisica BuscarDireccion(int p_IdPersona, string p_TipoDireccion)
        {
            try 
            {

                var query = from direccion in Context.per_direcciones
                            join pais in Context.zon_paises
                                on direccion.ped_spais equals pais.zpa_scodigo into PaisDireccion
                            from pais in PaisDireccion.DefaultIfEmpty()
                            join region in Context.zon_region
                                on direccion.ped_sregion equals region.zre_scod_region into RegionDireccion
                            from region in RegionDireccion.DefaultIfEmpty()
                            join valor in Context.cla_valores
                                on direccion.ped_stp_dir equals valor.cav_scodigo into ValorDireccion
                            from valor in ValorDireccion.DefaultIfEmpty()
                            where direccion.ped_ipersona == p_IdPersona
                             && direccion.ped_stp_dir == p_TipoDireccion
                             && valor.cav_satributo == Valores.TipoDireccion
                            select new
                            {
                                Direccion = direccion,
                                Pais = pais,
                                Region = region,
                                Valor = valor
                            };

                var temp = query.Single();

                return new DireccionFisica
                {

                    IdPersona = temp.Direccion.ped_ipersona,
                    IdAtencion = temp.Direccion.ped_iper_dirigido,
                    EsPrincipal = temp.Direccion.ped_cenvio == Valores.True ? true : false,
                    TipoDireccion = temp.Direccion.ped_stp_dir,
                    Pais = temp.Direccion.ped_spais,
                    Region = temp.Direccion.ped_sregion,
                    Poblacion = temp.Direccion.ped_stitulo,
                    ZonaPostal = temp.Direccion.ped_szip,
                    Linea1 = temp.Direccion.ped_slinea1,
                    Linea2 = temp.Direccion.ped_slinea2,
                    Linea3 = temp.Direccion.ped_slinea3,
                    Linea4 = temp.Direccion.ped_slinea4,
                    Telefono = new Telefono(temp.Direccion.ped_stelefono, "Telefono", temp.Pais.zpa_sddi),
                    CodPais = temp.Direccion.ped_spais,
                    CodRegion = temp.Direccion.ped_sregion,
                    TipoDireccionDescripcion = temp.Valor.cav_sdescripcion
                };
                
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}
